iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0

大家好!

理解完物件繼承的方法,就要接續介紹今天的 Getter 和 Setter 了。
我們進入今天的主題吧!


存取行為

出現賦值和取值的行為,就是存取行為。

let a;
a; // undefined
a = 'Felix'; // 'Felix'
a; // 'Felix'

/* or */

window.a; // undefined
window.a = 'Felix'; // 'Felix'
window.a; // 'Felix'

可賦值的情況下,新的值會是賦予的值,這是完全沒有爭議的,就像上方的舉例一樣。


存取器

Getter 和 Setter 顧名思義就是有 Get 和 Set 的行為,因此稱呼為「存取器」是最適合的了。
那麼存取器究竟如何使用呢?讓我們來看看:

document.cookie; // ''
document.cookie = 'name=Felix; max-age=9'; // 'name=Felix; max-age=9'
document.cookie; // 'name=Felix'
document.cookie = 'name=Felix; max-age=0'; // 'name=Felix; max-age=0'
document.cookie; // ''

document.cookie 賦值後,讀取的值會和賦予的值不同,這就是存取器的特色之一。
document.cookie 乍看之下就是物件屬性,但是為什麼又和一般的物件屬性不同呢?
原因是因為 document.cookie 被充當函式使用了。


定義存取器

定義存取器和定義屬性只有稍微不同,就是要在存取器的名稱前加上 getset

let clicking = {
    limit: 10,
    targets: [],
    get status() {
        return this.targets;
    },
    set status(t) {
        if (this.targets.length < this.limit) return this.targets.push(t);
        throw new Error('You have reached the maximum set limit.');
    }
};

上方的存取器有什麼用途呢?讓我們來看看:

window.addEventListener('click', function (e) {
    clicking.status = e.target;
    console.log('Clicked!');
});

/* 點擊網頁第 10 次 */
// Log: Clicked!
clicking.status; // [...×10]

/* 點擊網頁第 11 次 */
// Uncaught Error: You have reached the maximum set limit.
clicking.status; // [...×10]

網頁被點擊的前 10 次都會將點擊到的元素推入 clicking.targets 陣列,並記錄 Clicked! 於主控台。
但是,當點擊次數超過 10 次時,就會跳出錯誤,並停止執行觸發的函式,因此主控台不會有紀錄。


有更能理解存取器的作用嗎?

差不多也到尾聲了,接下來我們要介紹的是物件的凍結、防止擴展和密封方式。
如果對文章有任何疑問,也歡迎在下方提問和建議!
我是 Felix,我們明天再見!


上一篇
JS 12 - 繼承方法
下一篇
JS 14 - 控制物件
系列文
JavaScript 從 50% 開始,打造函式庫不是問題!46
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言